package org.quincy.rock.core.dao.sql;

/**
 * <b>操作运算符。</b>
 * <p><b>详细说明：</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * @version 1.0
 * @author mex2000
 * @since 1.0
 */
public enum Op {
	/**
	 * =
	 */
	EQUAL("=", OpType.RELATIONAL),
	/**
	 * !=
	 */
	NOTEQUAL("!=", OpType.RELATIONAL),
	/**
	 * >
	 */
	GREATER(">", OpType.RELATIONAL),
	/**
	 * >=
	 */
	GREATEREQUAL(">=", OpType.RELATIONAL),
	/**
	 * <
	 */
	LESS("<", OpType.RELATIONAL),
	/**
	 * <=
	 */
	LESSEQUAL("<=", OpType.RELATIONAL),
	/**
	 * is null
	 */
	ISNULL("IS NULL", OpType.RELATIONAL),
	/**
	 * is not null
	 */
	ISNOTNULL("IS NOT NULL", OpType.RELATIONAL),
	/**
	 * like
	 */
	LIKE("LIKE", OpType.RELATIONAL),
	/**
	 * not like
	 */
	NOTLIKE("NOT LIKE", OpType.RELATIONAL),
	/**
	 * BETWEEN
	 */
	BETWEEN("BETWEEN", OpType.RELATIONAL),
	/**
	 * NOT BETWEEN
	 */
	NOTBETWEEN("NOT BETWEEN", OpType.RELATIONAL),
	/**
	 * IN
	 */
	IN("IN", OpType.RELATIONAL),
	/**
	 * NOT IN
	 */
	NOTIN("NOT IN", OpType.RELATIONAL),
	/**
	 * 加法
	 */
	ADD("+", OpType.ARITHMETIC),
	/**
	 * 减法
	 */
	MINUS("-", OpType.ARITHMETIC),
	/**
	 * 乘法
	 */
	MULTIPLY("*", OpType.ARITHMETIC),
	/**
	 * 除法
	 */
	DIVIDE("/", OpType.ARITHMETIC),
	/**
	 * 除法
	 */
	MOD("%", OpType.ARITHMETIC),
	/**
	 * 并且
	 */
	AND("AND", OpType.LOGICAL),
	/**
	 * 或者
	 */
	OR("OR", OpType.LOGICAL);

	/**
	 * 操作运算符
	 */
	private String op;

	/**
	 * 运算符类型。
	 */
	private OpType opType;

	/**
	 * <b>构造方法。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param op 操作运算符
	 * @param opType 运算符类型
	 */
	Op(String op, OpType opType) {
		this.op = op;
		this.opType = opType;
	}

	/**
	 * <b>返回操作运算符。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @return 操作运算符
	 */
	public String op() {
		return this.op;
	}

	/**
	 * <b>运算符类型。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @return 运算符类型
	 */
	public OpType opType() {
		return this.opType;
	}

	/**
	 * <b>是否是名称或符号。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param uName 名称或符号
	 * @return 是否是名称或符号
	 */
	public boolean isNameOrSign(String uName) {
		return uName.equals(this.name()) || uName.equals(this.op);
	}

	/**
	 * <b>根据名称或符号返回Op操作运算符。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param name 名称或符号
	 * @return 操作运算符
	 */
	public static Op of(String name) {
		if (name == null)
			throw new NullPointerException("Op Name is null");
		String uName = name.toUpperCase();
		for (Op op : values()) {
			if (op.isNameOrSign(uName))
				return op;
		}
		throw new IllegalArgumentException("No enum constant Op[" + name + "]");
	}
}
